package com.tedu;

import java.io.*;
import java.security.Key;
import java.util.Properties;
import java.util.Set;

/**
 * @author CCFu
 * @version 1.0
 * @date 2021/12/21 18:47
 *java.util.Properties集合 extends Hashtable<k,v>  implements  Map<k,v>
 *  Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。
 *  Properties集合是一个唯一和io流相结合的集合
 *  可以使用Properties集合中的方法store，把集合中的临时数据，持久化写入到硬盘中存储
 *  可以使用Properties集合中的方法load，把硬盘中保存的文件（键值对），读取到集合中使用
 *
 *  属性列表中的每个键及其对应的值都是一个字符串。
 *  Properties集合是一个双列集合，key和value默认都是字符串，所以用集合时不用写泛型
 */
public class Proper {

    public static void main(String[] args) throws IOException {
        //show01();
        //show02();
        show03();
    }

    private static void show03() throws IOException {
        /*
        可以使用Properties集合中的方法load，把硬盘中保存的文件（键值对），读取到集合中使用
        void load​(InputStream inStream) （参数：字节输入流，不能读取含有中文的键值对）从输入字节流读取属性列表（键和元素对）。
        void load​(Reader reader) （参数：字符输入流，能读取含有中文的键值对）以简单的线性格式从输入字符流读取属性列表（关键字和元素对）。
        使用步骤：
        1. 创建Properties集合对象，添加数据
        2.使用Properties集合对象中的方法load读取保存键值对的文件
        3.遍历Properties集合

        注意：
        1.存储键值对的文件中，键与值默认的连接符号可以使用=,空格（或其他符号）
        2.存储键值对的文件中，可以使用#进行注释，被注释的键值对不会再被读取
        3.存储键值对的文件中，键与值默认都是字符串，不能再加引号
         */
        //1. 创建Properties集合对象
        Properties prop = new Properties();
       // 2.使用Properties集合对象中的方法load读取保存键值对的文件
        prop.load(new FileReader("D:\\\\software\\\\IDEA\\\\Homework\\\\src\\\\com\\\\tedu\\\\prop.properties"));
        //prop.load(new FileInputStream("D:\\\\software\\\\IDEA\\\\Homework\\\\src\\\\com\\\\tedu\\\\prop.properties"));
        //不能读取含有中文的，一般不用
        //3.遍历Properties集合
        Set<String> set = prop.stringPropertyNames();
        for (String key : set) {
            String value = prop.getProperty(key);
            System.out.println(key+"="+value);
        }


    }

    private static void show02() throws IOException {
        //可以使用Properties集合中的方法store，把集合中的临时数据，持久化写入到硬盘中存储
        //void store​(OutputStream out, String comments)
        //void store​(Writer writer, String comments)
        //参数：  OutputStream out:字节输出流，不能写入中文
        //       Writer writer：字符输出流，可以写中文
        //       String comments：注释，用来解释说明保存的文件是做什么用的，
        //       不能使用中文，会产生乱码，默认Unicode编码 一般使用“ ”空字符串

        /*使用步骤：
        1.创建Properties集合对象，添加数据
        2.创建字节输出流/字符输出流对象，构造方法中绑定要输出的目的地
        3.使用Properties集合中的方法store，把集合中的临时数据，持久化写入到硬盘中存储
         */
        //1.创建Properties集合对象，使用setProperty往集合中添加数据
        Properties prop = new Properties();
        prop.setProperty("赵丽颖", "168");
        prop.setProperty("迪丽热巴", "165");
        prop.setProperty("古力娜扎", "160");
        //2.创建字节输出流/字符输出流对象，构造方法中绑定要输出的目的地
        //FileWriter fw = new FileWriter("D:\\software\\IDEA\\Homework\\src\\com\\tedu\\prop.properties");
        //3.使用Properties集合中的方法store，把集合中的临时数据，持久化写入到硬盘中存储
        //prop.store(fw, "save data");
        //4.释放资源
       // fw.close();

        prop.store(new FileOutputStream(".\\prop.properties"),"");
    }

    /*
    使用Properties集合存储数据，遍历取出Properties集合中的数据
    Properties集合是一个双列集合，key和value默认都是字符串
    Properties集合有一些操作字符串的特有方法
    Object setProperty​(String key, String value) （往集合中存储数据）调用 Hashtable方法 put 。
    String getProperty​(String key)（通过key找到value值，此方法相当于Map集合中的get（key）方法） 使用此属性列表中指定的键搜索属性。
    Set<String> stringPropertyNames​() 从该属性列表中返回一个不可修改的键的集和，其中键及其对应的值是字符串。此方法相当于Map集合中的keySet方法


     */
    private static void show01() {
        //创建Properties集合对象
        Properties prop = new Properties();
        //使用setProperty往集合中添加数据
        prop.setProperty("赵丽颖", "168");
        prop.setProperty("迪丽热巴", "165");
        prop.setProperty("古力娜扎", "160");
        //prop.put(1,true);不建议使用 可以存储任意类型的值

        //使用stringPropertyNames把Properties集合中的键取出，存储到一个set集合中
        Set<String> set = prop.stringPropertyNames();

        //遍历set集合，取出Properties集合的每一个键
        for (String key : set) {
            //使用getProperty方法通过key获取value
            String value = prop.getProperty(key);
            System.out.println(key+"="+value);

        }



    }
}
